home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok08.lha
/
MemSystem1.1e
/
MemSystem.dok
< prev
next >
Wrap
Text File
|
1993-08-15
|
6KB
|
144 lines
Dokumentation zu "MemSystem" V1.1
Autor: Nicolas Benezan, Postwiesenstr. 2, D7000 Stuttgart 60
Übersicht
---------
MemSystem ist ein Speicherverwaltungsmodul, das gegenüber dem Standardmodul
"Heap" folgende Vorteile aufweist:
* es ist voll Multitaskingfähig, d.h. es kann vom Hauptmodul importiert und
von mehreren Tasks aus parallel benutzt werden. Dabei wird allozierter
Speicher immer in der MemList des aufrufenden Tasks eingetragen. Bei
Beendigung des Tasks (mit RemTask oder bei Process-Termination) wird der
gesammte mit MemSystem verwaltete Speicher freigegeben.
* Wird mehr Speicher angefordert als frei ist, wird dies nicht sofort mit
NIL beantwortet, sondern ein Requester (Retry/Cancel) erzeugt. Der Benutzer
hat somit die Möglichkeit, z.B. einige Workbench-Windows zu schließen, um
es dann noch einmal zu probieren. Der Programmieraufwand ist praktisch
null, entgegen der sonst üblichen Methode, dach jedem AllocMem() auf NIL zu
testen, den Requester anzuzeigen ...
* System-Deadlocks, die durch extremen Speichermangel hervorgerufen werden
können, werden verhindert. Viele Programme erzeugen bei Speichermangel eine
Meldung mit AutoRequest() (zB. auch der Modula-Compiler). Es wird aber oft
vergessen, daß der Requester selbst auch Speicher benötigt. MemSystem
berücksichtigt dies.
Außerdem wurden noch einige nützliche Prozeduren implementiert:
* Eine vereinfachte AutoRequest()-Prozedur
* Prozeduren zum Abbruch des Programms entweder über Retry-Cancel-
Requester oder ähnlich der Arts.Error-Prozedur oder ohne irgendeine Meldung
Allocate, AllocMem, Deallocate
------------------------------
Diese Prozeduren entsprechen in der Schnittstelle sowie in der Handhabung
genau den gleichnamigen Prozeduren von Heap. Allerdings läuft beim
allozieren von Speicher für das aufrufende Programm unsichtbar noch
folgendes ab:
* Es wird getestet, ob Size+MinMemory Speicher frei ist.
* falls nicht wird ein Requester (Low Memory Warning Retry/Cancel) erzeugt.
Bei "Retry" wird noch einmal versucht, die angeforderte Speichermenge zur
verfügung zu stellen. Bei "Cancel" wird NIL zurückgegeben, wie man es von
Heap bei Speichermangel kennt.
* falls doch wird der Speicher wie gewohnt alloziert. Der Speicherbereich
wird in der MemList des aufrufenden Tasks oder Prozesses registriert.
Einwandfreie Funktion ist auch bei mehreren parallellaufenden Tasks, die
auch unabhängig voneinander erzeugt und terminiert werden können,
gewährleistet. Die Prozeduren sind reentrant.
Ein Deallozieren von Speicher, den man gar nicht alloziert hat führt nicht
zum Guru, sondern wird abgefangen.
YesNoRequest
------------
Dies ist eine Vereinfachung von AutoRequest(). Sie wird intern von
Allocate, AllocMem (bei Speichermangel) und von RecoverableExit verwendet.
Als "Zugabe" wurde die Prozedur auch im Definition-Module aufgeführt und
somit für jedermann zugänglich gemacht. Die Parameter dürften
selbsterklärend sein (siehe auch Intuition.AutoRequest).
RecoverableExit
---------------
Dies ist gewissermaßen die Kombination aus Arts.BreakPoint und Arts.Error.
Während BreakPoint nach beantworten des Requesters immer weitermacht, und
Error immer abbricht, kann der Benutzer bei RecoverableExit selbst
entscheiden.
Die Prozedur verwndet die Variablen Window und ErrHeader (siehe dort).
ReqBody: Zeiger auf den String der "Requester-Überschrift"
PosText: Zeiger auf den Text im linken Gadget (Programm fortsetzen)
NegText: Zeiger auf den Text des rechten Gadget (abbrechen)
DeadEndExit
-----------
Entspricht Arts.Error, mit dem Unterschied, daß nicht die häßliche Meldung
"Modula-2 Programmunterbruch" erscheint. Stattdessen wird ErrHeader (siehe
unten) und darunter ReqBody angezeigt.
ExitQuiet
---------
ermöglicht das korrekte beenden des Programms von jeder beliebigen Stelle
aus (auch vom 671sten rekursiven Funktionsaufruf...). Ebenso wie auch bei
DeadEndExit und RecoverableExit funktioniert hierbei der
TermProcedure-Mechanismus ordnungsgemäß.
Window
------
Diese Variable wird beim Aufruf von AutoRequest() durch MemSystem verwendet
und sollte vor Verwendung von Prozeduren dieses Moduls initialisiert
werden. Zwar funktioniert meines Wissens nach auch alles einwandfrei, wenn
"Window" nicht initialisiert ist bzw. auf NIL steht, aber mit rücksicht auf
die Aufwärtskompatiblität sollte man sich trotzdem an die Konventionen
halten.
ErrHeader
---------
Ist die Überschrift jedes Requesters, der von MemSystem erzeugt wird.
minMemory
---------
gibt die größe des Speichers an, der minimal noch freibleiben muß, damit
die korrekte Funktion des Systems gewährleistet ist. Default ist 20kB, was
für einige Notfall-Requester oder Alerts ausreicht.
Hysteresis
----------
Damit nach einem Speichermangel wieder Speicher alloziert werden kann, muß
mindestens minMemory+Hysteresis Speicher frei sein. Die Hysterese wurde
eingeführt, damit bei einem Arbeiten an der minMemory-Grenze nicht all paar
Sekunden ein Requester erscheint, sondern der Speicher nach einem
erfolgreichen "Retry" wieder für eine Weile reicht. Default ist 30kB.
Konstanten
----------
Für die Prozeduren YesNoRequest und RecoverableExit werden einige
vordefinierte Texte wie z.B. "Retry", "Cancel" usw. bereitgestellt, um den
Aufwand des Arbeitens mit MemSystem möglichst gering zu halten.
Anmerkung zur neuen Version 1.1e
--------------------------------
Die alte Version arbeitete nicht einwandfrei, wenn das Programm vom CLI
aus gestartet wurde. Der nicht zurückgegebene Speicher wurde erst bei
EndCli freigegeben. Die neue Version gibt den mit MemSystem allozierten
Speicher beim Programmende korrekt zurück.
Multitasking
------------
Die Multitaskingfähigkeit von MemSystem hat natürlich nur einen Sinn, wenn
auch in Modula Multitasking programmiert werden kann. Zur Zeit arbeite ich
immer noch an einem Modul, das diese Fähigkeiten in Modula unterstützt.
"TaskSupport" wird wahrscheinlich auf einer der nächsten Amok-Disketten
erscheinen. Als Warnung sei gesagt, daß die Prozedur ExecSupport.CreateTask
zumindest bis zur Compilerversion 3.11d nicht einwandfrei funktioniert
(stürzt manchmal und nicht reproduzierbar ab). Falls jemand schon
Erfahrungen mit Multitasking in Modula gemacht hat, würde es mich freuen,
wenn er sich mit mir in Verbindung setzen würde.
___________________________
Viel Spaß mit MemSystem!
Bene